package ec.edu.ups.cidi.siia.plamdep.moduloweb.notificaciones;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.ejb.Singleton;
import javax.mail.*;
import javax.mail.internet.*;
public class ServicioEmail {
    
    private Properties props = new Properties();
    //Dirección del email del usario que envía el mensaje
    private String emailUsuarioEmisor;
    //Contraseña del usuario que envía el correo electrónico
    private String claveEmailUsuarioEmisor;
    private Session session;
    /**
     * 
     * Crea un objeto para enviar correo electrónico
     * a través de los servidores de gmail
     * @param emailUsuarioEmisor dirección email del usuario que envía el mensaje
     * @param claveEmailUsuarioEmisor contraseña del usuario que envía el mensaje
     */
    public ServicioEmail(String emailUsuarioEmisor, String claveEmailUsuarioEmisor) 
    {
        this.emailUsuarioEmisor = emailUsuarioEmisor;
        this.claveEmailUsuarioEmisor = claveEmailUsuarioEmisor;
    }
    
    public void iniciarSesionGmail() {
            props=System.getProperties();
            props.setProperty("mail.user", emailUsuarioEmisor);
            props.setProperty("mail.password", claveEmailUsuarioEmisor);
            props.setProperty("mail.smtp.host", "smtp.gmail.com");
            props.setProperty("mail.smtp.port", "465");
            props.setProperty("mail.smtp.starttls.enable", "true");
            props.setProperty("mail.smtp.auth", "true");
            props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            //props.setProperty("mail.smtp.socketFactory.fallback", "false");
            session = Session.getInstance(props,
            new javax.mail.Authenticator() {
              protected PasswordAuthentication getPasswordAuthentication() {
                  return new PasswordAuthentication(emailUsuarioEmisor, claveEmailUsuarioEmisor);
              }
            });
    }
    public void iniciarSesionOutlook() 
    {
           props = new Properties();
           props.put("mail.smtp.user", emailUsuarioEmisor);
           props.put("mail.smtp.host","outlook.office365.com");
           props.put("mail.smtp.port", "587");
           props.put("mail.smtp.auth", "true");
           props.put("mail.smtp.starttls.enable", "true");
           SecurityManager security = System.getSecurityManager();
           Authenticator auth = new AutentificadorSMTP();
           session = Session.getInstance(props, auth);
    }
     /**
     * Método que permite enviar un correo electrónico en texto plano
     * @param receptor dirección email del usuario a quien se le envía el mensaje
     * @param asunto asunto del correo electrónico
     * @param cuerpoMensaje  cuerpo del mensaje del correo electrónico
     */    
      public void enviarEmail(String receptor, String asunto, String texto) 
      {
            try   
            {
                MimeMessage m = new MimeMessage(session);
                Address from = new InternetAddress(this.emailUsuarioEmisor);
                Address[] to = new InternetAddress[] {new InternetAddress(receptor) };
                m.setFrom(from);
                m.setRecipients(javax.mail.Message.RecipientType.TO, to);
                m.setSubject(asunto);
                m.setSentDate(new java.util.Date());
                texto = texto.replaceAll("\n", "<br/>");
                m.setContent(texto,"text/html; charset=utf-8");
                System.out.println("intentando enviar correo elecronic");
                Transport.send(m);
            }catch (Exception e){ e.printStackTrace();}
	}
      /**
       * Método que permite enviar un correo electrónico en texto plano mas un archivo adjunto
       * @param receptor irección email del usuario a quien se le envía el mensaje
       * @param asunto asunto del correo electrónico
       * @param texto  cuerpo del mensaje del correo electrónico
       * @param direcion ruta del archivo adjunto
       */
      public void enviarEmail(String receptor, String asunto, String texto,String direcion) {
        try    {
            BodyPart adjunto = new MimeBodyPart();
            adjunto.setDataHandler(new DataHandler(new FileDataSource(direcion)));
            
            adjunto.setFileName("reporte_plamdep.pdf");
            
            BodyPart contenido = new MimeBodyPart();
            texto = texto.replaceAll("\n", "<br/>");
            contenido.setText(texto);
            
            MimeMultipart multiParte = new MimeMultipart();
            multiParte.addBodyPart(contenido);
            multiParte.addBodyPart(adjunto);
            
            MimeMessage mail = new MimeMessage(session);
            Address from = new InternetAddress(this.emailUsuarioEmisor);
            Address[] to = new InternetAddress[] {new InternetAddress(receptor) };
            mail.setFrom(from);
            mail.setRecipients(javax.mail.Message.RecipientType.TO, to);
            mail.setSubject(asunto);
            mail.setSentDate(new java.util.Date());
            mail.setContent(multiParte);
            
            Transport t = session.getTransport("smtp");
            t.connect(receptor,asunto);
            t.sendMessage(mail, mail.getAllRecipients());
            t.close();
          //fin agregado
        }catch (Exception e){ e.printStackTrace();}
     }
     private class AutentificadorSMTP extends javax.mail.Authenticator 
     {
             public PasswordAuthentication getPasswordAuthentication() 
             {
                   return new PasswordAuthentication(emailUsuarioEmisor, claveEmailUsuarioEmisor);
             }
     }
}//Fin de la Clase 
